Skip to content

tools, build system: introduce PYTHON3_WITH_PEP723#22223

Open
maribu wants to merge 3 commits into
RIOT-OS:masterfrom
maribu:dist/tools/usb-serial/pipx
Open

tools, build system: introduce PYTHON3_WITH_PEP723#22223
maribu wants to merge 3 commits into
RIOT-OS:masterfrom
maribu:dist/tools/usb-serial/pipx

Conversation

@maribu
Copy link
Copy Markdown
Member

@maribu maribu commented Apr 28, 2026

Contribution description

  • Document that Python scripts should use PEP 723 Inline script metadata
  • Add PYTHON3_WITH_PEP723 as variable to allow uers to switch their running, such as uv run or pipx run or even just python3
  • Document that in the CI preparing a venv on demand is not acceptable, set PYTHON3_WITH_PEP723 to python3 in the CI
  • ttys.py already has been updated to follow the new style

Testing procedure

  1. ./dist/tools/usb-serial/ttys.py should work without pyudev installed, if uv is installed
  2. make -C examples/basic/default list-ttys should work without pyudev installed, if uv is installed
  3. PYTHON3_WITH_PEP723="pipx run" make -C examples/basic/default list-ttys should work without pyudev installed, if pipx is installed and somewhat recent
  4. PYTHON3_WITH_PEP723="python3" make -C examples/basic/default list-ttys should work if pyudev installed, regardless of whether pipx or uv are installed

Issues/PRs references

None

Declaration of AI-Tools / LLMs usage:

AI-Tools / LLMs that were used are:

  • none

@github-actions github-actions Bot added the Area: tools Area: Supplementary tools label Apr 28, 2026
@maribu maribu added Type: enhancement The issue suggests enhanceable parts / The PR enhances parts of the codebase / documentation Impact: minor The PR is small in size and might only require a quick look of a knowledgeable reviewer CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR labels Apr 28, 2026
@maribu maribu enabled auto-merge April 28, 2026 14:11
@crasbe
Copy link
Copy Markdown
Contributor

crasbe commented Apr 28, 2026

Am I special? 🤣

cbuec@W11nMate:~/RIOTstuff/riot-vanilla/RIOT$ make -C examples/basic/hello-world/ list-ttys
make: Entering directory '/home/cbuec/RIOTstuff/riot-vanilla/RIOT/examples/basic/hello-world'
using BOARD="native64" as "native" on a 64-bit system
/usr/bin/env: ‘pipx’: No such file or directory
make: *** [/home/cbuec/RIOTstuff/riot-vanilla/RIOT/examples/basic/hello-world/../../../Makefile.include:880: list-ttys] Error 127
make: Leaving directory '/home/cbuec/RIOTstuff/riot-vanilla/RIOT/examples/basic/hello-world'

After installing pipx, I get an infinite wall of this:

cbuec@W11nMate:~/RIOTstuff/riot-vanilla/RIOT$ make -C examples/basic/hello-world/ list-ttys
make: Entering directory '/home/cbuec/RIOTstuff/riot-vanilla/RIOT/examples/basic/hello-world'
using BOARD="native64" as "native" on a 64-bit system
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
...
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
⚠️  /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py is already on your PATH and installed at /home/cbuec/RIOTstuff/riot-vanilla/RIOT/dist/tools/usb-serial/ttys.py. Downloading and running anyway.
^CTraceback (most recent call last):
  File "/usr/bin/pipx", line 5, in <module>
    from pipx.main import cli
  File "/usr/lib/python3/dist-packages/pipx/main.py", line 19, in <module>
    from packaging.requirements import InvalidRequirement, Requirement
  File "/home/cbuec/.local/lib/python3.10/site-packages/packaging/requirements.py", line 8, in <module>
    from ._parser import parse_requirement as _parse_requirement
  File "/home/cbuec/.local/lib/python3.10/site-packages/packaging/_parser.py", line 12, in <module>
    from ._tokenizer import DEFAULT_RULES, Tokenizer
  File "/home/cbuec/.local/lib/python3.10/site-packages/packaging/_tokenizer.py", line 60, in <module>
    "VARIABLE": re.compile(
  File "/usr/lib/python3.10/re.py", line 251, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python3.10/re.py", line 303, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python3.10/sre_compile.py", line 788, in compile
    p = sre_parse.parse(p, flags)
  File "/usr/lib/python3.10/sre_parse.py", line 955, in parse
    p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
  File "/usr/lib/python3.10/sre_parse.py", line 444, in _parse_sub
    itemsappend(_parse(source, state, verbose, nested + 1,
  File "/usr/lib/python3.10/sre_parse.py", line 841, in _parse
    p = _parse_sub(source, state, sub_verbose, nested + 1)
  File "/usr/lib/python3.10/sre_parse.py", line 444, in _parse_sub
    itemsappend(_parse(source, state, verbose, nested + 1,
  File "/usr/lib/python3.10/sre_parse.py", line 525, in _parse
    if this[0] == "\\":
KeyboardInterrupt
make: *** [/home/cbuec/RIOTstuff/riot-vanilla/RIOT/examples/basic/hello-world/../../../Makefile.include:880: list-ttys] Interrupt

@crasbe
Copy link
Copy Markdown
Contributor

crasbe commented Apr 28, 2026

Perhaps it would be a good idea to add pipx to make print-versions if it's now a dependency that's regularly used?

@crasbe
Copy link
Copy Markdown
Contributor

crasbe commented Apr 28, 2026

This is Ubuntu 22.04.5 LTS on WSL btw:

cbuec@W11nMate:~/RIOTstuff/riot-vanilla/RIOT$ python3 --version
Python 3.10.12
cbuec@W11nMate:~/RIOTstuff/riot-vanilla/RIOT$ pipx --version
1.0.0

@maribu
Copy link
Copy Markdown
Member Author

maribu commented Apr 28, 2026

You could run it with pipx run pipx run dist/tools/usb-serial/ttys.py 😜

@maribu
Copy link
Copy Markdown
Member Author

maribu commented Apr 28, 2026

Maybe we should go for uv run instead, if there are still pipx versions with https://peps.python.org/pep-0723/ not implemented yet out there?

I think uv is installed using cargo install uv mostly, which will give you a recent tool.

@crasbe
Copy link
Copy Markdown
Contributor

crasbe commented Apr 28, 2026

pipx version 1.0.0 is from January 2022, so a good 1.5 years older than the PEP 👀

I installed pipx fresh with apt install pipx.

@AnnsAnns
Copy link
Copy Markdown
Member

AnnsAnns commented Apr 28, 2026

Maybe we should go for uv run instead, if there are still pipx versions with https://peps.python.org/pep-0723/ not implemented yet out there?

I think uv is installed using cargo install uv mostly, which will give you a recent tool.

I +1 a transition to uv, esp. since there is also a uv plugin for tox and I find our python tox stuff to be quite flaky since it doesn't have to benefits that uv brings to python envs like very exact version pinning. I also heard from @LasseRosenow that uv has become the quasi universal standard for modern python environments (Back in my days ppl used poetry 😔)

@riot-ci
Copy link
Copy Markdown

riot-ci commented Apr 28, 2026

Murdock results

✔️ PASSED

184586a Update CODING_CONVENTIONS.md

Success Failures Total Runtime
11124 0 11124 13m:35s

Artifacts

@kfessel
Copy link
Copy Markdown
Contributor

kfessel commented Apr 29, 2026

How about adding a shell script in front that tries to identify which ever python venv management is installed

#!/bin/sh
if which pipx; then exec pipx run tty.py $*; fi
if which poetry; then exec poetry run tty.py $*; fi
if which uv; then exec uv run tty.py $*; fi
if which upy ; then exec upy tty.py $*; fi
if which python3; then exec python3 tty.py $*; fi
exec python tty.py $*

and than runs the python script through that and as a last resort just calls the script on its own to check whether the user just does not want a venv manger but had installed the dependency trough their package manger (no one would use pip).

-- instead of adding a new dependency on a specific python venv manger
there probaly already is someone that develops the new python runner finaly i get dependancy handling good somewhere

maribu added 2 commits June 4, 2026 17:31
This allows users to not having to care about python dependencies.

In addition SPDX annotations have been added.
- Document that Python scripts should use [PEP 723 Inline script metadata][pep723]
- Add `PYTHON3_WITH_PEP723` as variable to allow uers to switch their
  running, such as `uv run` or `pipx run` or even just `python3`
- Document that in the CI preparing a venv on demand is not acceptable,
  set `PYTHON3_WITH_PEP723` to `python3` in the CI

[pep723]: https://peps.python.org/pep-0723/
@maribu maribu force-pushed the dist/tools/usb-serial/pipx branch from 2ee9ec4 to e3604b8 Compare June 4, 2026 15:35
@maribu maribu requested review from jia200x and kaspar030 as code owners June 4, 2026 15:35
@github-actions github-actions Bot added Area: doc Area: Documentation Area: build system Area: Build system Area: CI Area: Continuous Integration of RIOT components labels Jun 4, 2026
@maribu maribu changed the title dist/tools/usb-serial: use pipx for as runner tools, build system: introduce PYTHON3_WITH_PEP723 Jun 4, 2026
@maribu maribu requested review from chrysn, crasbe, mguetschow and miri64 June 4, 2026 15:40
@crasbe crasbe disabled auto-merge June 4, 2026 15:40
@maribu maribu added the Process: API change Integration Process: PR contains or issue proposes an API change. Should be handled with care. label Jun 4, 2026
@crasbe
Copy link
Copy Markdown
Contributor

crasbe commented Jun 5, 2026

Would this mean, that we don't have to install the python dependencies for certain packages in the riotbuild docker container anymore?

Which would also mean we don't have to set up the VENV stuff to update to a newer Python version?

Which would also mean we can update the Ubuntu version?

@chrysn
Copy link
Copy Markdown
Member

chrysn commented Jun 5, 2026

Would this mean, that we don't have to install the python dependencies for certain packages in the riotbuild docker container anymore?

I think there we have a choice: Not install anything there any more, or install everything and set PYTHON3_WITH_PEP723="python3" (which is the assertion that everything we'd ever ever need in this RIOT checkout is already installed). I'd prefer the latter, as it makes the container suitable both for full-offline use (well you'l still need packages) and nicely sidesteps issues of a PEP723 run installing things into a location that's temporary and thus gone on the next make all.

@chrysn
Copy link
Copy Markdown
Member

chrysn commented Jun 5, 2026

Which would also mean we can update the Ubuntu version?

If that's holding us back, that "everything we'll ever need" could also be installed in a venv in the container that is active from the start.

@crasbe
Copy link
Copy Markdown
Contributor

crasbe commented Jun 5, 2026

Which would also mean we can update the Ubuntu version?

If that's holding us back, that "everything we'll ever need" could also be installed in a venv in the container that is active from the start.

The issue that's holding us back is that nobody wants to tackle it, but @kaspar030 did something with venv in RIOT-OS/riotdocker#239

I'd skip 24.04 LTS though and go to 26.04 LTS now.

Comment thread CODING_CONVENTIONS.md Outdated
Co-authored-by: crasbe <crasbe@gmail.com>
Copy link
Copy Markdown
Contributor

@kfessel kfessel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new dependancy intrdduced

@@ -1,4 +1,15 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isn't the entire point of PEP723 to not introduce a dependancy on a specific tool

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes But.

Python does not ship any out of the box that qualifies for the shebang.

All our invocations of any of our Python scripts happen through the PYTHON3_WITH_PEP723 executor and thus ignore the shebang.

The use that remains for the shebang (or, really, the executable bit set on the file) is for developers while they work on that script, or when they invoke it directly for some other reason. Nothing we set in there will work for everyone, but that path is not taken by RIOT itself, so just placing something in there is no new dependency, and anyone who invokes it and runs into trouble can just prefix it with the tool of their choosing.

Would it be better if python3 just did this? Yes. But that's not in there now, not sure if planned, and even if, some time down the road until users have it. Until then, we can make the best possible guess there, or leave it to the respective script's maintainers to pick any that works for them.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please read the cover letter of the PR first before commenting.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⬆️ I was referring to Karl. @chrysn clearly did.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but uv is just a random choice
and a user might have their package manager mange their python dependencies

why should the shebang point to uv and not just python which with the right dependencies installed is capable of executing a python-script

since our automatic exec happens through a PEP runner (selectable) anyway there is no reason to put that into the shebang

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The optimization goal for the she-bang is to pick something that is simple to maintain and works well for the majority of users.

Asking users to install uv is much easier than asking users to install a long list of python modules. Especially when the documentation containing the long list of python modules becomes out of date or contains modules that easily conflict with each other.

Copy link
Copy Markdown
Contributor

@kfessel kfessel Jun 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why uv and not npm or pip or pipx or poetry or nix or ...

the python packagemanger should be a user choice a python script should not care

not all packemanger are able to read pep but if they install a python and the dependancies the *system python is able to exec that script

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the build system we can control how scripts are executed. The proposal here is to just use PYTHON3_WITH_PEP723 as knob that allows users to pick what they please, while picking a sane default that is going to work for most users.

The shebang format however expects a single interpreter. So we have to make a choice here.

Here are the options for the list that I consider as serious suggestions, and what pros/cons I see for them as shebang:

  1. Use python3 directly:
    • Pros:
      • Karl is happy
    • Cons:
      • Not one dependency to care about, but many
      • Not running into a missing tool once, but for each and every script
      • Documentation may get stale, needs to manually be kept in sync with the requirements in code
  2. Use pipx run:
    • Pros:
      • Only a recent version of pipx needs to be installed
    • Cons:
      • Footgun: Ubuntu 24.04 ships a version of pipx that is not compatible with PEP 723 and fails with cryptic errors
      • Needs network access the first time you execute a script
      • Relatively slow the first to you run a script
  3. Use uv run:
    • Pros:
      • Only a recent version of uv needs to be installed
      • Very portable and easy to install (e.g. even on a raspberry pi without root permissions installing it was a one-liner)
      • Orders of magnitude faster than pipx
    • Cons:
      • Needs network access the first time you execute a script

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how is this

Image

a valid way of installing something (at least they added a you might want to take a look first box and do not default to we want to be placed in /bin aka sudo needed)

Its is not even like clicking on every executable (something people get made fun of after security incidents) it is injecting a download directly into your system no rubber-ducky needed.

maybe we should add the download ahead of the shebang just to be sure.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to add to suggestion 1
default to python3 directly and add documentation that one might want to run python scripts with their favourite python runner

uv run dist/tools/usb-serial/ttys.py
or
pipx run dist/tools/usb-serial/ttys.py
or
check the dependency documented in PEP.. form at the beginning of the python file

@AnnsAnns
Copy link
Copy Markdown
Member

AnnsAnns commented Jun 5, 2026

I'm not fully following anymore, is the discussion still about this PR or about what would need to happen for docker to be updated to fully make use of PEP723?

Comment thread CODING_CONVENTIONS.md
Comment on lines -708 to +718
#!/usr/bin/env python3
#!/usr/bin/env -S uv run
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use python to exec python scripts

Copy link
Copy Markdown
Contributor

@kfessel kfessel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing procedure

  1. ./dist/tools/usb-serial/ttys.py should work with pyudev installed regardless of yet another py packagemaneger

@kfessel
Copy link
Copy Markdown
Contributor

kfessel commented Jun 5, 2026

I'm not fully following anymore, is the discussion still about this PR or about what would need to happen for docker to be updated to fully make use of PEP723?

the docker shall not make use of PEP723 as written in the PR description it is not good to setup a venv with every ci invokation

Comment thread Makefile.include
# choose `pipx run` or just `python3` instead. In case of just `python3`, there
# will be no PEP 723 support and users will just have to install the right
# python modules beforehand.
PYTHON3_WITH_PEP723 ?= uv run
Copy link
Copy Markdown
Contributor

@kfessel kfessel Jun 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
PYTHON3_WITH_PEP723 ?= uv run
# your python runner we conveniently chose a default that supports PEP 723 but any other might do
PYTHON ?= uv run

as python without PEP 723 is a valid choice ( as illustrated by this PR and the documentation above)

further more it reduces the inconvenience if one does not want to use uv
to

PYTHON=python make ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: build system Area: Build system Area: CI Area: Continuous Integration of RIOT components Area: doc Area: Documentation Area: tools Area: Supplementary tools CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR Impact: minor The PR is small in size and might only require a quick look of a knowledgeable reviewer Process: API change Integration Process: PR contains or issue proposes an API change. Should be handled with care. Type: enhancement The issue suggests enhanceable parts / The PR enhances parts of the codebase / documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants